﻿/* ******************************************************** */
/* Arcans Project (2010)                                    */
/* Jeu 3D en temps réel par navigateur, conception et       */
/* Développement dans la notice                             */
/* Jeu sous licence GNU GPL v3 (voir NOTICE et COPYING)     */
/* ******************************************************** */

//variables globales ******************************************************************************
var regval = new RegExp(/^[\w]+[\w\-\.]{2,}$/);
var regemail = new RegExp(
		/^[a-zA-Z0-9]+([_|\.|-]{1}[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([_|\.|-]­{1}[a-zA-Z0-9]+)*[\.]{1}[a-z]{2,6}$/);
var ajax;

function remplacerStyle(style, nomElement, valeurFinale) {
	remplacement = 0;
	listeStyles = style.split(';');
	for (i = 0; i < listeStyles.length; i++) {
		if (listeStyles[i].indexOf(nomElement, 0) != -1) {
			listeStyles[i] = nomElement + ": " + valeurFinale;
			remplacement = 1;
		}
	}
	if (remplacement == 0) {
		listeStyles[listeStyles.length - 1] = nomElement + ": " + valeurFinale;
		listeStyles[listeStyles.length] = "";
	}
	style = listeStyles.join(";");
	return style;
}

// gestion de l'encart et du voile
// *****************************************************************
var EncartClass = function(nomEncart) {

	this.encart = document.getElementById("encart");
	this.voile = document.getElementById("voile");
	this.title_div;
	this.head_div;
	this.alert_div;
	this.table_div;
	this.foot_div;
	// méthodes :
	// ouverture de l'encart
	this.ouverture = function(taille, titre, nomEncart) {
		if (nomEncart != "") {
			if (docXml.getElementsByTagName("div").length != 0) {
				for (i = 0; i < docXml.getElementsByTagName("div").length; i++) {
					if (docXml.getElementsByTagName("div")[i]
							.getAttribute("id") == nomEncart) {
						for (j = 0; j < docXml.getElementsByTagName("div")[i].childNodes.length; j++) {
							document
									.getElementById("encart")
									.appendChild(
											docXml.getElementsByTagName("div")[i].childNodes[j]
													.cloneNode(true));
						}
						break;
					}
				}
			}
		}
		window.scrollTo(0, 0);
		// document.body.style.overflow = "hidden"; --> KO avec FFX
		document.getElementsByTagName("body")[0].style.overflow = 'hidden';
		this.voile.style.display = "block";
		this.encart.style.display = "block";
		for ( var i = 0; i < 9; i++)
			window.setTimeout(
					"document.getElementById('voile').style.opacity = 0." + i,
					50 * i);
		this.encart.style.top = "-300px";
		this.encart.style.left = "550px";
		this.encart.style.width = taille;
		for ( var i = 0; i < 9; i++) {
			var temp = -400 + i * 55;
			window.setTimeout("document.getElementById('encart').style.top = '"
					+ temp + "px';", 50 * i);
		}
		/*
		 * this.title_div = document.createElement("h3");
		 * this.title_div.appendChild(document.createTextNode(titre));
		 * this.encart.appendChild(this.title_div); this.head_div =
		 * document.createElement("div");
		 * this.encart.appendChild(this.head_div); this.alert_div =
		 * document.createElement("div");
		 * this.encart.appendChild(this.alert_div); this.table_div =
		 * document.createElement("table");
		 * this.encart.appendChild(this.table_div); this.foot_div =
		 * document.createElement("div");
		 * this.encart.appendChild(this.foot_div);
		 */
	};
	// création de paragraphes d'entête
	this.addHeadPara = function(valeur) {
		var crea_para = document.createElement("p");
		crea_para.appendChild(document.createTextNode(valeur));
		this.head_div.appendChild(crea_para);
	};
	// mise à zéro de l'entete
	this.resetHeader = function() {
		while (this.head_div.hasChildNodes())
			this.head_div.removeChild(this.head_div.firstChild);
	};
	// mise à jour de l'alerte, paragraphes
	this.alerte = function(classe, texte) {
		var crea_para = document.createElement("p");
		crea_para.setAttribute("class", classe);
		crea_para.appendChild(document.createTextNode(texte));
		this.alert_div.appendChild(crea_para);
	};
	// mise à jour de l'alerte, liens
	this.alerteLien = function(lien, texte, fonction) {
		var crea_para = document.createElement("p");
		var crea_lien = document.createElement("a");
		crea_lien.setAttribute("href", lien);
		if (fonction != "")
			crea_lien.setAttribute("onclick", fonction);
		crea_lien.appendChild(document.createTextNode(texte));
		crea_para.appendChild(crea_lien);
		this.alert_div.appendChild(crea_para);
	};
	// mise à zéro de l'alerte, si besoin
	this.resetAlerte = function() {
		while (this.alert_div.hasChildNodes())
			this.alert_div.removeChild(this.alert_div.firstChild);
	};
	// mise à zéro du tableau
	this.resetTable = function() {
		while (this.table_div.hasChildNodes())
			this.table_div.removeChild(this.table_div.firstChild);
	};
	// création de lignes à label + input + bouton
	this.addLigne = function(id, libel, type_input, bouton, fonction) {
		var crea_cell = document.createElement("td");
		var crea_row = document.createElement("tr");
		var crea_label = document.createElement("label");
		crea_label.setAttribute("for", id);
		crea_label.appendChild(document.createTextNode(libel));
		crea_cell.appendChild(crea_label);
		crea_row.appendChild(crea_cell);
		crea_cell = document.createElement("td");
		var crea_input = document.createElement("input");
		if (id != "email")
			crea_input.setAttribute("maxlength", "15");
		crea_input.setAttribute("type", type_input);
		crea_input.setAttribute("id", id);
		crea_cell.appendChild(crea_input);
		crea_row.appendChild(crea_cell);
		if (bouton != "") {
			crea_cell = document.createElement("td");
			var crea_button = document.createElement("button");
			crea_button.setAttribute("onclick", fonction);
			crea_button.appendChild(document.createTextNode(bouton));
			crea_cell.appendChild(crea_button);
			crea_row.appendChild(crea_cell);
		}
		this.table_div.appendChild(crea_row);
	};
	// mise à zéro du footer
	this.resetFooter = function() {
		while (this.foot_div.hasChildNodes())
			this.foot_div.removeChild(this.foot_div.firstChild);
	};
	// création de boutons dans le pied du panel
	this.addFootBouton = function(valeur, fonction) {
		var crea_button = document.createElement("button");
		crea_button.setAttribute("onclick", fonction);
		crea_button.appendChild(document.createTextNode(valeur));
		this.foot_div.appendChild(crea_button);
	};
	// création de lien dans le pied du panel
	this.addFootLien = function(lien, texte, fonction) {
		var crea_para = document.createElement("p");
		var crea_lien = document.createElement("a");
		crea_lien.setAttribute("href", lien);
		if (fonction != "")
			crea_lien.setAttribute("onclick", fonction);
		crea_lien.appendChild(document.createTextNode(texte));
		crea_para.appendChild(crea_lien);
		this.foot_div.appendChild(crea_para);
	};
	// fermeture de l'encart
	this.fermeture = function() {
		for (i = 0; i < 9; i++) {
			window.setTimeout(
					"document.getElementById('voile').style.opacity = 0."
							+ (8 - i), 50 * i);
			var temp = 40 - i * 55;
			window.setTimeout("document.getElementById('encart').style.top = '"
					+ temp + "px';", 50 * i);
		}
		// window.setTimeout("encart.suppression();", 390);
		window.setTimeout("viderEncart();", 390);
		window.setTimeout(
				"document.getElementById('voile').style.display = 'none'", 400);
		window
				.setTimeout(
						"document.getElementById('encart').style.display = 'none'",
						400);
		// document.body.style.overflow = "auto";
		document.getElementsByTagName("body")[0].style.overflow = 'hidden';
	};
	// suppression des éléments du panel
	this.suppression = function() {
		/*
		 * this.encart.removeChild(this.title_div);
		 * this.encart.removeChild(this.head_div);
		 * this.encart.removeChild(this.alert_div);
		 * this.encart.removeChild(this.table_div);
		 * this.encart.removeChild(this.foot_div);
		 */
	};
};

function viderEncart() {
	if ( document.getElementById('encart').hasChildNodes() )
	{
	    while ( document.getElementById('encart').childNodes.length >= 1 )
	    {
	    	document.getElementById('encart').removeChild( document.getElementById('encart').firstChild );       
	    } 
	}
}

// gestion de l'ajax
// *******************************************************************************
try {
	var ajax = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
	try {
		var ajax = new ActiveXObject('Microsoft.XMLHTTP');
	} catch (e2) {
		try {
			var ajax = new XMLHttpRequest();
		} catch (e3) {
			ajax = false;
		}
	}
}
var ajaxFun = function(address, nb_param, tab_param, fonction_res) {
	// ajax fonction
	ajax.onreadystatechange = function() {
		if (ajax.readyState == 4) {
			if (ajax.status == 200) {
				if (fonction_res != "") {
					result = ajax.responseXML;
					infos = result.getElementsByTagName("infos").item(0);
					if (infos.getAttribute("type") == "text")
						fonction_res(parseInt(infos.getAttribute("value")));
					else if (infos.getAttribute("type") == "xml")
						fonction_res(result);
				}
			}
		}
	};
	// lancement de l'ajax
	ajax.open("POST", "?p=" + address, true);
	ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	var donnees = "";
	for ( var ident = 0; ident < nb_param; ident++) {
		if (ident != 0)
			donnees = donnees + "&";
		donnees = donnees + "info" + ident + "=" + tab_param[ident];
	}
	ajax.send(donnees);
};

// gestion du hashage
// ******************************************************************************
// extension de la fonction toHexStr de la classe Number
Number.prototype.toHexStr = function() {
	var s = "", v;
	for ( var i = 7; i >= 0; i--) {
		v = (this >>> (i * 4)) & 0xf;
		s += v.toString(16);
	}
	return s;
};
// fonctions nécessaires pour le hashage
function ROTR(n, x) {
	return (x >>> n) | (x << (32 - n));
}
function Sigma0(x) {
	return ROTR(2, x) ^ ROTR(13, x) ^ ROTR(22, x);
}
function Sigma1(x) {
	return ROTR(6, x) ^ ROTR(11, x) ^ ROTR(25, x);
}
function sigma0(x) {
	return ROTR(7, x) ^ ROTR(18, x) ^ (x >>> 3);
}
function sigma1(x) {
	return ROTR(17, x) ^ ROTR(19, x) ^ (x >>> 10);
}
function Ch(x, y, z) {
	return (x & y) ^ (~x & z);
}
function Maj(x, y, z) {
	return (x & y) ^ (x & z) ^ (y & z);
}
// fonction de hashage
var hashFun = function(chaine) {
	var K = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,
			0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,
			0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,
			0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
			0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,
			0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
			0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,
			0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
			0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
			0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,
			0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,
			0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
			0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ];
	var H = [ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f,
			0x9b05688c, 0x1f83d9ab, 0x5be0cd19 ];
	chaine += String.fromCharCode(0x80);
	var l = chaine.length / 4 + 2;
	var N = Math.ceil(l / 16);
	var M = new Array(N);
	for ( var i = 0; i < N; i++) {
		M[i] = new Array(16);
		for ( var j = 0; j < 16; j++) {
			M[i][j] = (chaine.charCodeAt(i * 64 + j * 4) << 24)
					| (chaine.charCodeAt(i * 64 + j * 4 + 1) << 16)
					| (chaine.charCodeAt(i * 64 + j * 4 + 2) << 8)
					| (chaine.charCodeAt(i * 64 + j * 4 + 3));
		}
	}
	M[N - 1][14] = ((chaine.length - 1) * 8) / Math.pow(2, 32);
	M[N - 1][14] = Math.floor(M[N - 1][14]);
	M[N - 1][15] = ((chaine.length - 1) * 8) & 0xffffffff;
	var W = new Array(64);
	var a, b, c, d, e, f, g, h;
	for ( var i = 0; i < N; i++) {
		for ( var t = 0; t < 16; t++) {
			W[t] = M[i][t];
		}
		for ( var t = 16; t < 64; t++) {
			W[t] = (sigma1(W[t - 2]) + W[t - 7] + sigma0(W[t - 15]) + W[t - 16]) & 0xffffffff;
		}
		a = H[0];
		b = H[1];
		c = H[2];
		d = H[3];
		e = H[4];
		f = H[5];
		g = H[6];
		h = H[7];
		for ( var t = 0; t < 64; t++) {
			var T1 = h + Sigma1(e) + Ch(e, f, g) + K[t] + W[t];
			var T2 = Sigma0(a) + Maj(a, b, c);
			h = g;
			g = f;
			f = e;
			e = (d + T1) & 0xffffffff;
			d = c;
			c = b;
			b = a;
			a = (T1 + T2) & 0xffffffff;
		}
		H[0] = (H[0] + a) & 0xffffffff;
		H[1] = (H[1] + b) & 0xffffffff;
		H[2] = (H[2] + c) & 0xffffffff;
		H[3] = (H[3] + d) & 0xffffffff;
		H[4] = (H[4] + e) & 0xffffffff;
		H[5] = (H[5] + f) & 0xffffffff;
		H[6] = (H[6] + g) & 0xffffffff;
		H[7] = (H[7] + h) & 0xffffffff;
	}
	return H[0].toHexStr() + H[1].toHexStr() + H[2].toHexStr()
			+ H[3].toHexStr() + H[4].toHexStr() + H[5].toHexStr()
			+ H[6].toHexStr() + H[7].toHexStr();
};

// gestion des affichages / masquage
// ***************************************************************
var aff_masq = function(div_name, bouton_name, type, choix) {
	var div_op = document.getElementById(div_name);
	var bouton = document.getElementById(bouton_name);
	var texte = "";
	var disp = "";
	if (choix == "a") {
		texte = "Masquer ";
		disp = "block";
		choix = "m";
	} else {
		texte = "Afficher ";
		disp = "none";
		choix = "a";
	}
	div_op.style.display = disp;
	bouton.setAttribute("onclick", "javascript:aff_masq('" + div_name + "','"
			+ bouton_name + "','" + type + "','" + choix + "');");
	bouton.removeChild(bouton.firstChild);
	switch (type) {
	case "obj":
		texte = texte + "les objectifs";
		break;
	}
	bouton.appendChild(document.createTextNode(texte));
};